﻿/**
 * @brief     串口通信-异步通信
 * @details
 * @author    Yin
 * @version   1.0
 * @date      2024-07-19
 * @copyright
 * @note
 */

#ifndef ASYNCSERIALPORT_H
#define ASYNCSERIALPORT_H

#include "common_global.h"

#include <QObject>
#include <QSerialPort>

#define ASYNC_SERIALPORT_REPLY_TIMEOUT   3000

namespace Common {

	class COMMONSHARED_EXPORT AsyncSerialPort : public QObject
	{
		Q_OBJECT
	public:
		explicit AsyncSerialPort(QObject *parent = nullptr);
		~AsyncSerialPort();

	public:
		/**
		 * @brief	getSerialPort 获取串口指针
		 * @return
		 */
		QSerialPort * getSerialPort();

		/**
		 * @brief open  打开串口
		 * @param portName 串口名称
		 * @param baudRate 波特率
		 * @param dataBits 数据位
		 * @param parity
		 * @param stopBits 停止位
		 * @param flowControl 流控
		 * @return
		 */
		bool open(const QString portName, 
			const QSerialPort::BaudRate baudRate = QSerialPort::Baud9600, 
			const QSerialPort::DataBits dataBits = QSerialPort::Data8,
			const QSerialPort::Parity parity = QSerialPort::NoParity,
			const QSerialPort::StopBits stopBits = QSerialPort::OneStop, 
			const QSerialPort::FlowControl flowControl = QSerialPort::NoFlowControl);

		/**
		 * @brief close 关闭串口
		 */
		void close();

		/**
		 * @brief isOpen 判断串口是否打开
		 * @return
		 */
		bool isOpen();

		/**
		 * @brief clear 清除串口的数据
		 * @return
		 */
		bool clear();

		/**
		 * @brief sendSerialMsg 发送串口消息
		 * @param buff 写入的消息
		 * @return
		 */
		bool sendSerialMsg(const QByteArray buff);

	Q_SIGNALS:
		/**
		 * @brief signalRecvSerialMsg 发送接收串口消息
		 * @param buff
		 */
		void signalRecvSerialMsg(QByteArray buff);

		/**
		 * @brief signalSerialError 发送串口异常消息
		 * @param strError
		 */
		void signalSerialError(QString strError);

	private Q_SLOTS:
		/**
		 * @brief slotReceiveSerialPortInfo 接收串口消息
		 */
		void slotReceiveSerialPortInfo();

		/**
		 * @brief slotReceiveErrorOccurred
		 * @param error
		 */
		void slotReceiveErrorOccurred(QSerialPort::SerialPortError error);

	private:
		QSerialPort * m_serialPort;         // 串口操作类
	};

} //namespace Common

#endif // ASYNCSERIALPORT_H
